﻿CREATE PROCEDURE [dbo].[InventoryLinesTrancInsert]
(--создаёт корректирующею проводку по строке документа инвентаризации в случае если расчетное количество не совпадает с фактическим
	@DocId int,
	@GoodsId int, --используется если создаётся новый приход
	@PartyId int OUTPUT,
	@DocQntty int,
	@FactQntty int,
	@BarCode char(12),
	@SupplierGoodsId int,
	@ManufacturerPrice decimal(19, 2),
	@SupplierPrice decimal(19, 2),
	@SupplierSumNOTAX decimal(19, 2), --Сумма по строке накладной без налогов
	@ImportMarkup float,
	@SupplierMarkup float,
	@BatchNumber varchar(20),
	@ReadyBefore smalldatetime,
	@MadeDate smalldatetime,
	@NDSTax tinyint,
	@NDSValue decimal(19, 2),
	@ReestrPrice decimal(19, 2),
	@ReestrDate smalldatetime,
	@GTDNumber varchar(30),
	@CertificateNumber varchar(80),
	@CertificateDate smalldatetime,
	@CertificateOrgId int,
	@RetailMarkup float,
	@RetailPrice decimal(19, 2),
	@ContragentId int,
	@ContragentDocDate smalldatetime,
	@ContragentDocNumber varchar(20),
	@Note varchar(250),
	@MD datetime,
	@MW varchar(50),
	@GoodsDocLineId int OUTPUT
)
AS	
DECLARE @intInputLineId int, @intReturnLineId int, @DocDate smalldatetime
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int, @intRowCount int
DECLARE @intInputCount int, @intOutputCount int, @intT int, @intNextId int

SET NOCOUNT ON
IF (@DocId Is Null) OR (@DocQntty Is Null) OR (@FactQntty Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@DocQntty < 0) OR (@FactQntty < 0)
BEGIN
	SELECT @intErrCode = 2, 
	@strMsg = 'Количество должно быть больше или равно нулю!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

--TODO проверить чтобы небыло дублирования партии в документе
--получение значения идентификатора
IF @GoodsDocLineId Is Null
BEGIN
	EXEC @intRet = dbo.GetNextCounterFor 'GoodsLines', @GoodsDocLineId OUTPUT
	IF @intRet <> 0 RETURN @intRet
END

--расчетное количество НЕ совпадает с фактическим
--нужно делать корректирующие проводки
IF (@DocQntty > @FactQntty )
BEGIN --недостача
	IF (@PartyId Is Null)
	BEGIN
		SELECT @intErrCode = 50, 
		@strMsg = 'Не указана партия для которой обнаружена недостача!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
--проверить чтобы при вводе недостачи не было отрицательных остатков
	SELECT @DocDate = DocDate, @intT = @FactQntty - @DocQntty
	FROM CA.Documents WHERE Id = @DocId
	EXEC @intRet = dbo.CheckPartyFlow @PartyId, @intT, @DocDate, @intInputCount OUTPUT, @intOutputCount OUTPUT
	IF (@intRet <> 0) RETURN @intRet

	SELECT @RetailPrice = P.RetailPrice, @intReturnLineId = L.Id
	FROM CD.Parties P INNER JOIN CA.GoodsDocLines L ON P.Id = L.PartyId AND P.DocId = L.DocId
	WHERE P.Id = @PartyId
	
	--корректирующия (расходная) проводка
	INSERT INTO [CA].[GoodsDocLines]
	(Id, DocId,PartyId, [Qntty],[RetailSum], ReturnLineId,[MD],[MW])
	VALUES(@GoodsDocLineId, @DocId, @PartyId, @FactQntty - @DocQntty, @RetailPrice * (@FactQntty - @DocQntty), @intReturnLineId, @MD, @MW)

	SELECT @intErrCode = @@error, @intRowCount = @@rowcount
	IF @intErrCode <> 0 RETURN @intErrCode

	IF (@intRowCount <> 1)
	BEGIN
		SELECT @intErrCode = 51, 
		@strMsg = 'Запись в таблицу товародвижения не добавлена!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END

END ELSE BEGIN --излишки

	IF (@PartyId Is Null) --неизвестная партия
	BEGIN --делаем новый приход с новой партией

		IF (@GoodsId Is Null)
		BEGIN
			SELECT @intErrCode = 52, 
			@strMsg = 'Не указана код товара, по которому обнаружены излишки!'
			RAISERROR (@strMsg, 11, 1)
			RETURN @intErrCode
		END
		IF (@RetailPrice Is Null) OR (@RetailPrice <= 0)
		BEGIN
			SELECT @intErrCode = 53, 
			@strMsg = 'Цена для новой партии для излишков д.б. больше нуля!'
			RAISERROR (@strMsg, 11, 1)
			RETURN @intErrCode
		END

--новый приход
		SET @FactQntty = @FactQntty - @DocQntty
		EXEC @intRet = dbo.InputLinesInsertUpdate @DocId,@GoodsId,@FactQntty,@SupplierGoodsId,@ManufacturerPrice,
		@SupplierPrice,@SupplierSumNOTAX,@ImportMarkup,@SupplierMarkup,@BatchNumber,@ReadyBefore,@MadeDate,
		@NDSTax,@NDSValue,@ReestrPrice,@ReestrDate,@GTDNumber,
		@CertificateNumber,@CertificateDate,@CertificateOrgId,@RetailMarkup,
		@ContragentId,@ContragentDocDate,@ContragentDocNumber,
		@Note,@MD,@MW,
		@GoodsDocLineId, 1, @intRowCount OUTPUT
		IF @intRet <> 0 RETURN @intRet

--новая партия и проводка
		EXEC @intRet = dbo.PartyGoodsInsert	@GoodsDocLineId, @DocId, @GoodsId,
		@BarCode, @FactQntty, @RetailPrice, Null,
		@Note, @MD, @MW, 1
		IF @intRet <> 0 RETURN @intRet
		SET @PartyId = @GoodsDocLineId
		
	END ELSE BEGIN  --партия по которой возникли излишки известна
		SELECT @intReturnLineId = L.Id, @RetailPrice = P.RetailPrice
		FROM CD.Parties P INNER JOIN CA.GoodsDocLines L ON P.Id = L.PartyId AND P.DocId = L.DocId
		WHERE P.Id = @PartyId
		IF @intRet <> 0 RETURN @intRet

		--корректирующия (приходная) проводка
		INSERT INTO [CA].[GoodsDocLines]
		(Id, DocId,PartyId, [Qntty],[RetailSum], ReturnLineId,[MD],[MW])
		VALUES(@GoodsDocLineId, @DocId, @PartyId, @FactQntty - @DocQntty, @RetailPrice * (@FactQntty - @DocQntty), @intReturnLineId, @MD, @MW)

		SELECT @intErrCode = @@error, @intRowCount = @@rowcount
		IF @intErrCode <> 0 RETURN @intErrCode

		IF (@intRowCount <> 1)
		BEGIN
			SELECT @intErrCode = 54, 
			@strMsg = 'Запись в таблицу товародвижения не добавлена!'
			RAISERROR (@strMsg, 11, 1)
			RETURN @intErrCode
		END

	END --EndOf IF (@PartyId Is Null) 
END --EndOf IF (@DocQntty > @FactQntty )

RETURN 0


